gtkpopover: Update the menu's alignment
authorTimm Bäder <mail@baedert.org>
Tue, 17 Mar 2015 18:34:43 +0000 (19:34 +0100)
committerTimm Bäder <mail@baedert.org>
Fri, 29 May 2015 15:37:04 +0000 (17:37 +0200)
... when the popover position changes.

gtk/gtkmenusectionbox.c
gtk/gtkmenusectionbox.h
gtk/gtkpopover.c

index 359d6341d50e42ecc67c192f6af60d2b141bb4e3..1f38e1b81f0bc9b7ebfd366186929e2ab65df1c8 100644 (file)
@@ -277,7 +277,7 @@ gtk_menu_section_box_insert_func (GtkMenuTrackerItem *item,
       gchar *name;
 
       widget = g_object_new (GTK_TYPE_MODEL_BUTTON,
-                             "menu-name", gtk_menu_tracker_item_get_label (item), 
+                             "menu-name", gtk_menu_tracker_item_get_label (item),
                              NULL);
       g_object_bind_property (item, "label", widget, "text", G_BINDING_SYNC_CREATE);
       g_object_bind_property (item, "icon", widget, "icon", G_BINDING_SYNC_CREATE);
@@ -369,10 +369,39 @@ gtk_menu_section_box_class_init (GtkMenuSectionBoxClass *class)
   G_OBJECT_CLASS (class)->dispose = gtk_menu_section_box_dispose;
 }
 
+static void
+update_popover_position_cb (GObject    *source,
+                            GParamSpec *spec,
+                            gpointer   *user_data)
+{
+  GtkPopover *popover = GTK_POPOVER (source);
+  GtkMenuSectionBox *box = GTK_MENU_SECTION_BOX (user_data);
+
+  GtkPositionType new_pos = gtk_popover_get_position (popover);
+
+  GList *children = gtk_container_get_children (GTK_CONTAINER (gtk_widget_get_parent (GTK_WIDGET (box))));
+  GList *l;
+
+  for (l = children;
+       l != NULL;
+       l = l->next)
+    {
+      GtkWidget *w = l->data;
+
+      if (new_pos == GTK_POS_BOTTOM)
+        gtk_widget_set_valign (w, GTK_ALIGN_START);
+      else if (new_pos == GTK_POS_TOP)
+        gtk_widget_set_valign (w, GTK_ALIGN_END);
+      else
+        gtk_widget_set_valign (w, GTK_ALIGN_CENTER);
+    }
+}
+
 void
 gtk_menu_section_box_new_toplevel (GtkStack    *stack,
                                    GMenuModel  *model,
-                                   const gchar *action_namespace)
+                                   const gchar *action_namespace,
+                                   GtkPopover  *popover)
 {
   GtkMenuSectionBox *box;
 
@@ -384,6 +413,9 @@ gtk_menu_section_box_new_toplevel (GtkStack    *stack,
                                        gtk_menu_section_box_insert_func,
                                        gtk_menu_section_box_remove_func, box);
 
+  g_signal_connect (G_OBJECT (popover), "notify::position", G_CALLBACK (update_popover_position_cb), box);
+
+
   gtk_widget_show (GTK_WIDGET (box));
 }
 
index f7ec6ab8111eeecea54f07a7ce8bb33f5dc205ba..c300abea142c7faa36f848ae467ce33c1c4ff65b 100644 (file)
@@ -23,6 +23,7 @@
 #include <gtk/gtkmenutrackeritem.h>
 #include <gtk/gtkstack.h>
 #include <gtk/gtkbox.h>
+#include <gtk/gtkpopover.h>
 
 G_BEGIN_DECLS
 
@@ -43,7 +44,8 @@ typedef struct _GtkMenuSectionBox                           GtkMenuSectionBox;
 GType                   gtk_menu_section_box_get_type                   (void) G_GNUC_CONST;
 void                    gtk_menu_section_box_new_toplevel               (GtkStack    *stack,
                                                                          GMenuModel  *model,
-                                                                         const gchar *action_namespace);
+                                                                         const gchar *action_namespace,
+                                                                         GtkPopover  *popover);
 
 G_END_DECLS
 
index ba2fcba1ac48d7e44b4bcc86cbafcf2cd5cccf71..c156f8b8b1ac414ef84c462e2adb931122cfb096 100644 (file)
@@ -2330,7 +2330,10 @@ gtk_popover_bind_model (GtkPopover  *popover,
       gtk_widget_show (stack);
       gtk_container_add (GTK_CONTAINER (popover), stack);
 
-      gtk_menu_section_box_new_toplevel (GTK_STACK (stack), model, action_namespace);
+      gtk_menu_section_box_new_toplevel (GTK_STACK (stack),
+                                         model,
+                                         action_namespace,
+                                         popover);
       gtk_stack_set_visible_child_name (GTK_STACK (stack), "main");
 
       g_signal_connect (popover, "unmap", G_CALLBACK (back_to_main), NULL);